package com.etalk.crm.dao;

import com.etalk.crm.pojo.PaperTrackRecord;
import com.etalk.crm.pojo.QuestionBanks;
import com.etalk.crm.pojo.TestPaper;
import com.etalk.crm.pojo.TestPaperQBankRelation;
import com.etalk.crm.pojo.TestPaperType;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * @author Terwer
 */
@Mapper
public interface TestPaperMapper {
    /**
     * 查询试卷列表
     *
     * @param paramMap 搜索条件
     * @return 试卷列表
     */
    List<TestPaper> selectPaperListByPage(Map<String, Object> paramMap);

    /**
     * 查询发送出去的试卷列表
     *
     * @param paramMap 搜索条件
     * @return 试卷列表
     */
    List<TestPaper> selectSendedPaperListByPage(Map<String, Object> paramMap);

    /**
     * 根据id查询试卷
     *
     * @return
     */
    TestPaper selectByTestPaperId(@Param("testPaperId") Integer testPaperId);

    /**
     * 查询做过的试卷
     *
     * @return
     */
    TestPaper selectPaperByScoreId(@Param("scoreId") Integer scoreId);

    /**
     * 查询试卷类型下列数据
     *
     * @return
     */
    List<TestPaperType> selectPaperTypeList();

    /**
     * 删除教材关联
     *
     * @param paperId
     * @return
     */
    int deleteTextbokPaper(Integer paperId);

    /**
     * 添加教材关联
     *
     * @param textbookMap
     * @return
     */
    int batchSaveTextbookPaper(List<Map> textbookMap);

    /**
     * 保存试卷信息
     *
     * @param testPaper
     * @return
     */
    int saveTestPaper(TestPaper testPaper);

    /**
     * 修改试卷信息
     *
     * @param testPaper
     * @return
     */
    int updateTestPaper(TestPaper testPaper);

    /**
     * 插入试题关联信息
     *
     * @return
     */
    int batchSavePaperQBankRelation(List<TestPaperQBankRelation> testPaperQBankRelationList);

    /**
     * 查询试卷中的大题标题
     *
     * @param testPaperId 试卷ID
     * @return
     */
    List<Map> selectQuestionTitleList(@Param("testPaperId") Integer testPaperId);

    /**
     * 查询大题下面的所有子题目的信息
     *
     * @param testPaperId   试卷ID
     * @param qbankParentid 大题题目ID
     * @return
     */
    List<QuestionBanks> selectQuestionBanksList(@Param("testPaperId") Integer testPaperId, @Param("qbankParentid") Integer qbankParentid);

    /**
     * 删除试卷
     *
     * @param testPaperId
     * @return
     */
    int deleteTestPaperByTestPaperId(@Param("testPaperId") Integer testPaperId);

    /**
     * 删除分数关联
     *
     * @param testPaperId
     * @return
     */
    int deletePaperScore(@Param("testPaperId") Integer testPaperId);

    /**
     * 删除做题记录关联
     *
     * @param testPaperId
     * @return
     */
    int deleteInputAnswer(@Param("testPaperId") Integer testPaperId);

    /**
     * 删除题目关联
     *
     * @param testPaperId
     * @return
     */
    int deleteQBankRelation(@Param("testPaperId") Integer testPaperId);

    /**
     * 检测用户本试卷是否可以测试
     *
     * @return
     */
    Integer checkTestState(@Param("paperId") Integer paperId, @Param("personId") Integer personId);

    /**
     * 发送试卷给学生
     *
     * @param paramMap
     */
    void saveTestPaperScores(Map paramMap);

//    /**
//     * 更新该学生对本试卷的总分数
//     *
//     * @param scoreId
//     * @param score
//     * @return
//     */
//    Integer changeCountPaperScore(@Param("scoreId") Integer scoreId, @Param("score") Integer score);


    /**
     * 自动更新该学生对本试卷的总分数
     *
     * @param scoreId
     * @return
     */
    Integer changeCountPaperScoreAuto(@Param("scoreId") Integer scoreId);

    /**
     * 修改试卷状态
     *
     * @param scoreId
     * @param state
     * @return
     */
    Integer changePaperState(@Param("scoreId") Integer scoreId, @Param("state") Integer state);

    /**
     * 查询学生做过的试卷
     *
     * @param personId  学生ID
     * @param stateList 状态列表
     * @return
     */
    List<Map> selectByStudentAndPage(@Param("personId") Integer personId, @Param("stateList") List stateList);

    /**
     * 查询试卷中所有题目ID
     *
     * @param paramMap 筛选条件
     * @return 题目ID列表
     */
    List<Map> selectTestPaperQuestionInfo(Map paramMap);

    /**
     * 检测试卷是否可以自动批改
     *
     * @return 是否可自动批改
     */
    Integer checkIsAuto(Integer scoreId);

    /**
     * 查询订单中正在学习该课程的学生
     *
     * @param paperId 试卷ID
     * @return 结果
     */
    List<Integer> selectLearingStudentList(Integer paperId);

    /**
     * 批量插入试卷学生关联信息
     *
     * @param paperId   试卷ID
     * @param paramList 学生列表
     * @return 结果
     */
    int batchSaveTestPaperScoresByTextbook(@Param("paperId") Integer paperId, @Param("list") List paramList);

    /**
     * 查询做题结果信息
     *
     * @param scoreId 分数ID
     * @return 做题结果信息
     */
    Map selectExamReaultInfo(Integer scoreId);

    /**
     * 更新批改试卷
     *
     * @param scoreId
     * @return
     */
    int updatePaperCorrectTime(Integer scoreId);

    /**
     * 更新状态
     *
     * @param scoreId
     * @return
     */
    int updatePaperTrackStatus(@Param("scoreId") Integer scoreId, @Param("trackStatus") Integer trackStatus);

    /**
     * 修改跟进结果
     *
     * @param paperTrackRecord 跟进记录
     * @return 结果
     */
    int updatePaperTrackRecord(PaperTrackRecord paperTrackRecord);

    /**
     * 检测试卷中的错题是否已经全部掌握
     *
     * @param scoreId 分数ID
     * @return 未掌握的错题数目
     */
    int checkPaperAllUnderstand(Integer scoreId);

    /**
     * 批量更新题目排序
     *
     * @param paramMap 参数
     * @return 结果
     */
    int batchUpdatePaperQuestionSort(Map paramMap);

    /**
     * 查询试卷中做过的题目数目
     *
     * @param paperId 试卷ID
     * @return 结果
     */
    int selectPaperHasDone(Integer paperId);

    /**
     * 试卷启用禁用
     *
     * @param paperId 试卷ID
     * @return 结果
     */
    Integer changePaperAvailableState(@Param("paperId") Integer paperId, @Param("state") Integer state);
}
